package com.farm.bpm.server;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import com.farm.bpm.form.Form;
import com.farm.core.auth.domain.LoginUser;
import com.farm.core.sql.query.DataQuery;
import com.farm.core.sql.result.DataResult;

public interface FarmBpmServiceInter {
	/**
	 * 删除流程实例
	 * 
	 * @param processInstanceid
	 * @param currentUser
	 */
	void deleteProcessInstance(String processInstanceid, LoginUser currentUser);

	/**
	 * 查询流程实例信息
	 * 
	 * @param query
	 * @return
	 */
	DataResult queryProcessInstanceQuery(DataQuery query) throws SQLException;

	/**
	 * 查询流程定义信息
	 * 
	 * @param query
	 * @return
	 */
	DataResult queryProcessDef(DataQuery query) throws SQLException;

	/**
	 * 查询流程实例变量
	 * 
	 * @param query
	 * @return
	 */
	DataResult queryProcessInstanceVariables(DataQuery query,
			String processInstanceId) throws SQLException;

	/**
	 * 查询流程启动者
	 * 
	 * @param query
	 * @param processDefId
	 * @return
	 * @throws SQLException
	 */
	DataResult queryProcessStartIdentityLinks(DataQuery query,
			String processDefId) throws SQLException;

	/**
	 * 部署BPMN2.0xml文件
	 * 
	 * @param inputStream
	 * @param name
	 * @param processType
	 */
	void deployBpmn20XmlFile(InputStream inputStream, String fileName,
			String processType);

	/**
	 * 删除流程定义
	 * 
	 * @param id
	 */
	void deleteProcessDef(String processDefId) throws Exception;

	/**
	 * 激活流程定义
	 * 
	 * @param id
	 */
	void activateProcessDefinitionById(String processDefId);

	/**
	 * 暂停流程定义
	 * 
	 * @param id
	 */
	void suspendProcessDefinitionById(String processDefId);

	/**
	 * 导出bpmn2.0xml文件
	 * 
	 * @param processDefId
	 * @return
	 */
	InputStream getBpmn20XmlFile(String processDefId);

	/**
	 * 获得bpmn2.0xml文件名
	 * 
	 * @param processDefId
	 * @return
	 */
	String getBpmn20XmlFileName(String processDefId);

	/**
	 * 获得工作流BPMN2.0xml文件编写指导
	 * 
	 * @return
	 */
	Map<String, Object> getBPMN20xmlUserGuideReport() throws SQLException;

	/**
	 * 获得流程图片
	 * 
	 * @param ids
	 * @return
	 */
	InputStream getProcessDefDiagram(String processDefId);

	/**
	 * 为流程增加启动用户
	 * 
	 * @param processDefId
	 * @param userid
	 */
	public void addProcessStartUser(String processDefId, String userid);

	/**
	 * 为流程增加启动角色
	 * 
	 * @param processDefId
	 * @param roleid
	 */
	public void addProcessStartRole(String processDefId, String roleid);

	/**
	 * 删除流程启动角色或用户
	 * 
	 * @param processDefId
	 * @param roleidORuserid
	 */
	public void delStartUserOrRole(String processDefId, String roleidORuserid);

	/**
	 * 获得流程实例的流程图
	 * 
	 * @param processInstanceId
	 * @return
	 */
	InputStream getProcessInstanceDiagram(String processInstanceId);

	/**
	 * 查询流程实例参与者
	 * 
	 * @param query
	 * @param processInstanceId
	 * @return
	 */
	DataResult queryProcessInstanceIdentityLinks(DataQuery query,
			String processInstanceId);

	/**
	 * 修改流程实例变量
	 * 
	 * @param processInstanceId
	 * @param key
	 * @param value
	 */
	void setProcessInstanceVariable(String processInstanceId, String key,
			String value);

	/**
	 * 激活流程实例
	 * 
	 * @param processInstanceId
	 */
	void activateProcessInstanceById(String processInstanceId);

	/**
	 * 挂起流程实例
	 * 
	 * @param processInstanceId
	 */
	void suspendProcessInstanceById(String processInstanceId);

	/**
	 * 获得流程实例
	 * 
	 * @param processInstanceId
	 * @return
	 */
	ProcessInstance getProcessInstance(String processInstanceId);

	/**
	 * 获得当前用户正在处理任务
	 * 
	 * @param query
	 * @param currentUser
	 * @param roles
	 * @return
	 */
	DataResult queryUserCurrentTask(LoginUser currentUser,
			List<String> roles);

	/**
	 * 获得当前用户可以处理的任务
	 * 
	 * @param query
	 * @param currentUser
	 * @param currentUserRole
	 * @return
	 */
	DataResult queryUserWaitingTask(LoginUser currentUser,
			List<String> roles);

	/**
	 * 获得当前用户参与过的流程
	 * 
	 * @param query
	 * @param currentUser
	 * @param currentUserRole
	 * @return
	 */
	DataResult queryUserJoinTask(LoginUser currentUser);

	/**
	 * 启动一个任务
	 * 
	 * @param processDefId
	 * @param currentUser
	 * @param roles
	 */
	void startProcessDef(String processDefId, LoginUser currentUser,
			List<String> roles);

	/**
	 * 保存任务表单
	 * 
	 * @param taskId
	 * @param data
	 */
	void saveTaskFormData(String taskId, Map<String, String> data);

	/**
	 * 完成任务
	 * 
	 * @param taskId
	 */
	void submitTask(String taskId);

	/**
	 * 获得用户可启动的流程
	 * 
	 * @param ids
	 * @param currentUser
	 * @param currentUserRole
	 * @return
	 */
	Map<String, List<Map<String, Object>>> getUserStartableProcessDef(
			LoginUser currentUser, List<String> roles)
			throws SQLException;

	/**
	 * 获得用户表单
	 * 
	 * @param taskId
	 * @return
	 */
	Form getTaskForm(String taskId);

	/**
	 * 修改流程定义
	 * 
	 * @param processDefId
	 * @param flowType
	 * @param titleDes
	 */
	void editProcessDefInfo(String processDefId, String flowType,
			String titleDes);

	/**
	 * 获得流程定义
	 * 
	 * @param processDefId
	 * @return
	 */
	ProcessDefinition getProcessDefinition(String processDefId);

	/**
	 * 认领任务
	 * 
	 * @param taskid
	 * @param currentUser
	 */
	void claimTask(String taskid, LoginUser currentUser);

	/**
	 * 获得流程任务对象
	 * 
	 * @param taskid
	 * @return
	 */
	Task getTask(String taskid);

	/**
	 * 查询任务的参与者（小组或人）
	 * 
	 * @param query
	 * @param taskId
	 * @return
	 */
	DataResult queryTaskIdentityLinks(DataQuery query, String taskId);

	/**
	 * 放弃认领任务
	 * 
	 * @param taskid
	 */
	void unclaimTask(String taskid);

	/**
	 * 移交任务（同时activiti也提供代办功能，本API未实现）
	 * 
	 * @param taskId
	 * @param userId
	 */
	void setAssignee(String taskId, String userId);
}
